<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta name="generator" content="HTML Tidy for Linux/x86 (vers 1st November 2003), see www.w3.org"/>
    <title>JavaScript: Basics</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="copyright" content="Copyright &#169; 2005-2010 W3C (MIT, ERCIM, Keio)"/>
    <meta name="duration" content="5"/>
    <meta name="font-size-adjustment" content="-2"/>

    <link rel="stylesheet" href="styles/slidy.css" type="text/css"/>
    <link rel="stylesheet" href="styles/w3c-blue.css" type="text/css"/>
    <script type="text/javascript" src="scripts/slidy.js" charset="utf-8">//</script>

    <link type="text/css" rel="stylesheet" href="styles/shCoreDefault.css"/>
    <script type="text/javascript" src="scripts/shCore.js"></script>
    <script type="text/javascript" src="scripts/shBrushJScript.js"></script>
    <script type="text/javascript" src="scripts/shBrushJava.js"></script>

    <link type="text/css" rel="stylesheet" href="styles/presentation.css"/>
    <script type="text/javascript" src="scripts/presentation.js"></script>
</head>


<body style="">
<div class="background">
    <img alt="" id="head-icon" src="graphics/icon-blue.png"/>
</div>

<div class="background slanty">
</div>

<div class="slide cover title">
    <img class="hidden" src="graphics/bullet.png" alt=""/>
    <img class="hidden" src="graphics/fold.gif" alt=""/>
    <img class="hidden" src="graphics/unfold.gif" alt=""/>
    <img class="hidden" src="graphics/fold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/nofold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/unfold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-fold.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-unfold.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-fold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-nofold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-unfold-dim.gif" alt=""/>

    <h1>JavaScript: Basics</h1>

    <div style="position: absolute; bottom: 20px;">
        <p>Alex.Kolonitsky@gmail.com</p>
        <p><a href="http://javascript-learning-courses.googlecode.com/svn/trunk/Intermidiate-01-Basic.html">http://javascript-learning-courses.googlecode.com/svn/trunk/Intermidiate-01-Basic.html</a></p>
    </div>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul>
        <li>Syntax</li>
        <li>Objects</li>
        <li>Functions</li>
        <li>RegExp</li>
        <li>This</li>
    </ul>
</div>

<div class="slide">
    <h1>Цель</h1>

    <p>Не досконально рассмотреть синтаксис, а акцентировать внимание наименее известных синтаксических конструкциях.</p>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="current">Syntax</li>
        <li>Objects</li>
        <li>Functions</li>
        <li>RegExp</li>
        <li>This</li>
    </ul>
</div>

<div class="slide clf">
    <h1>Новые слова?</h1>

    <table class="keyword js">
        <tr>
            <td>break</td>
            <td>do</td>
            <td>if</td>
            <td>switch</td>
            <td>typeof</td>
        </tr>
        <tr>
            <td>case</td>
            <td>else</td>
            <td>in</td>
            <td>this</td>
            <td>var</td>
        </tr>
        <tr>
            <td>catch</td>
            <td>false</td>
            <td>instanceof</td>
            <td>throw</td>
            <td>void</td>
        </tr>
        <tr>
            <td>continue</td>
            <td>finally</td>
            <td>new</td>
            <td>true</td>
            <td>while</td>
        </tr>
        <tr>
            <td>default</td>
            <td>for</td>
            <td>null</td>
            <td>try</td>
            <td>with</td>
        </tr>
        <tr>
            <td>delete</td>
            <td>function</td>
            <td>return</td>
            <td></td>
            <td></td>
        </tr>
    </table>
</div>

<div class="slide clf">
    <h1>Syntax: Exception Handling</h1>

    <pre class="brush: js">
        try {
          ...
          throw {message: "Yo!"}
          throw new Error("Server timeout")
          throw new ConnectionError("Connection down")
          ...
        } catch (e) {
          alert("Show Yo!")
        } finally {
          // do anyway
        }
    </pre>
</div>

<div class="slide">
    <h1>Build-in Exceptions</h1>

    <ul class="incremental">
        <li>Error</li>
        <li>EvalError</li>
        <li>InternalError</li>
        <li>RangeError</li>
        <li>ReferenceError</li>
        <li>StopIteration</li>
        <li>...</li>
    </ul>
</div>

<div class="slide clf">
    <h1>Syntax: Loops</h1>

    <div class="incremental">
        <pre class="brush: js">
            // цикл только по собственным свойствам
            for(var key in obj) {
              if (obj.hasOwnProperty(key)) {
                … obj[key] …
              }
            }
        </pre>
    </div>
    <div class="incremental">
        <pre class="brush: js">
            // условие потом
            do { … } while (i&lt;5)
        </pre>
    </div>
    <div class="incremental">
        <pre class="brush: js">
            // метки :'(
            label: while (true) { if (cond) {break label;}}
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Operator: == </h1>

    <pre class="brush: js">
        ""           ==   "0"           // false
        0            ==   ""            // true
        0            ==   "0"           // true
        false        ==   "false"       // false
        false        ==   "0"           // true
        false        ==   undefined     // false
        false        ==   null          // false
        null         ==   undefined     // true
        " \t\r\n"    ==   0             // true
    </pre>
</div>

<div class="slide">
    <h1>Operator: === </h1>

    <pre class="brush: js">
        ""           ===  "0"           // false
        0            ===  ""            // false
        0            ===  "0"           // false
        false        ===  "false"       // false
        false        ===  "0"           // false
        false        ===  undefined     // false
        false        ===  null          // false
        null         ===  undefined     // false
        " \t\r\n"    ===  0             // false
    </pre>
</div>

<div class="slide">
    <h1>Operator: || </h1>

    <pre class="brush: js">
        ""           ||   "0"           // "0"
        0            ||   ""            // ""
        0            ||   "0"           // "0"
        false        ||   "false"       // "false"
        false        ||   "0"           // "0"
        false        ||   undefined     // undefined
        false        ||   null          // null
        null         ||   undefined     // undefined
        " \t\r\n"    ||   0             // " \t\r\n"
    </pre>
</div>

<div class="slide">
    <h1>Operator: || </h1>

    <p>Это операция часто используется, чтобы заменить конструкцию:</p>
    <pre class="brush: js">
        var var1 = param;
        if (!var1) {
            var1 = defaultValue;
        }
    </pre>
    <p>Илии такое </p>
    <pre class="brush: js">
        var var1 = param ? param : defaultValue
    </pre>

</div>

<div class="slide">
    <h1>Operator: || </h1>

    <p>На такое:</p>
    <pre class="brush: js">
        var var1 = param || defaultValue
    </pre>

    <p>Но эффектней это смотрится в таких случаях:</p>
    <pre class="brush: js">
        var var1 = param || findDefault() || tryToGuess();
    </pre>
</div>

<div class="slide">
    <h1>Example ||</h1>

    <pre class="brush: js">
        if ($('searchBox').getProperty('value')
                .toUpperCase() != defTxt
            && $('searchBox').getProperty('value').length>0){

            queryTxt = $('searchBox').value;
        }

        if (queryTxt.length > 0) {
            $('searchBox').setProperty('value', queryTxt);
        } else {
            $('searchBox').setProperty('value', defTxt);
        }
    </pre>
</div>

<div class="slide">
    <h1>Example ||</h1>

    <pre class="brush: js">
        var value = $('searchBox').getProperty('value');
        if (value.toUpperCase() != defTxt && value){
            queryTxt = value;
        }

        $('searchBox').setProperty('value',
                queryTxt || defTxt);
    </pre>
</div>

<div class="slide">
    <h1>Operator: && </h1>

    <pre class="brush: js">
        ""           &&   "0"           // ""
        0            &&   ""            // 0
        0            &&   "0"           // 0
        false        &&   "false"       // false
        false        &&   "0"           // false
        false        &&   undefined     // false
        false        &&   null          // false
        null         &&   undefined     // null
        " \t\r\n"    &&   0             // 0
    </pre>
</div>

<div class="slide">
    <h1>Operator: && </h1>

    <p>Этот оператор часто используется для преобразования конструкций:</p>
    <pre class="brush: js">
        if (cond) {
            doAction();
        }
    </pre>

    <p>К короткому виду:</p>
    <pre class="brush: js">
        cond && doAction()
    </pre>

    <p>Опять же эффект сильно увеличивается при увеличении последовательности действий\проверок</p>
</div>

<div class="slide">
    <h1>Operator: , </h1>

    <p>Есть в JavaScript загадочный оператор ','</p>
    <pre class="brush: js">
        (actionA(), actionB(), actionC())
    </pre>
    <p>Выполняет все три действия и возвращает результат последнего.</p>
</div>

<div class="slide">
    <h1>Operator: in</h1>

    <pre class="brush: js">
        var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
        0 in trees          // returns true
        3 in trees          // returns true

        // Predefined objects
        "PI" in Math        // returns true

        // Custom objects
        var mycar = {make: "Honda", model: "Accord", year: 1998};
        "make" in mycar     // returns true
    </pre>
</div>

<div class="slide">
    <h1>Operator: typeof</h1>

    <pre class="brush: js">
        typeof 37 === 'number';
        typeof Infinity === 'number';
        typeof NaN === 'number'; // Despite being "Not-A-Number"

        typeof undefined === 'undefined';
        typeof blabla === 'undefined'; // an undefined variable

        typeof null === "object"

        // weird
        typeof /s/ === 'function'; // Chrome 1-12
        typeof alert === 'object'; // IE 6, 7 and 8
    </pre>
</div>

<div class="slide">
    <h1>Operator: with</h1>

    <pre class="brush: js">
        var obj = {x:5, y:6};

        with (obj) {
            alert(x + y)
        }
    </pre>

    <p class="incremental">Абсолютное зло, не используйте его.</p>
</div>

<div class="slide">
    <h1>Operator: debugger</h1>
</div>

<div class="slide">
    <h1>Типы</h1>

    <ul>
        <li>Object</li>
        <li>Array</li>
        <li>String</li>
        <li>Number</li>
        <li>Boolean</li>
        <li>Function</li>
        <li>Date</li>
        <li>RegExp</li>
    </ul>
</div>

<div class="slide">
    <h1>Приведение типов</h1>

    <pre class="brush: js">
        // to string
        '' + 10 === '10'; // true

        // to number
        +'10' === 10;     // true

        // to boolean
        !!'0';            // true

        // String to Int
        parseInt(string , radix)
    </pre>
</div>

<div class="slide">
    <h1>parseInt(string, radix)</h1>

    <p>Если в процессе преобразования появляется неподходящий символ, преобразование заканичивается.</p>
    <pre class="brush: js">
        parseInt("15*3", 10);
        parseInt("15px", 10);
        parseInt("15em", 10);
        parseInt("015", 10);
        parseInt(15.99, 10);
    </pre>
</div>

<div class="slide">
    <h1>Точки с запятой</h1>

    <div class="incremental">
        <pre class="brush: js">
            log('init options')
            (options.list || []).forEach(creteItem(i))
        </pre>
    </div>
    <div class="incremental">
        <pre class="brush: js">
            log('init options')(options.list || []).forEach(creteItem(i))
        </pre>
    </div>
    <div class="incremental">
        <pre class="brush: js">
            return
            { foo: function() {} }
        </pre>
    </div>
    <div class="incremental">
        <pre class="brush: js">
            return;
            { foo: function() {} };
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Eval</h1>

    <pre class="brush: js">
        var str = "if (a) { 1+1 } else { 1+2 }"

        var a = true
        var b = eval(str)
        alert("b равно : " + b) // 2

        // теперь поменяем "a"

        a = false
        b = eval(str)
        alert("b равно : " + b) // 3
    </pre>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Syntax</li>
        <li class="current">Objects</li>
        <li>Functions</li>
        <li>RegExp</li>
        <li>This</li>
    </ul>
</div>

<div class="slide">
    <h1>Объекты</h1>

    <ul class="incremental">
        <li>В JavaScript всё является объектом, лишь за одним исключением — <code class="js keyword">undefined</code>.</li>
        <li>Объекты в JavaScript представляют из себя хеш-таблицу: набор именованных свойств (ключей), привязанных к значениям.</li>
        <li>
            <pre class="brush: js">
                var obj = {
                  shiny: true,
                  isShiny: function() {
                    return this.shiny;
                  }
                };
            </pre>
        </li>
    </ul>
</div>

<div class="slide">
    <h1>Объекты: добавляем свойства</h1>

    <p>Получить доступ к свойствам объекта можно двумя способами:</p>
    <pre class="brush: js">
        var foo = {name: 'Kitten', age: 27}
    </pre>
    <dl>
        <dt>Используя точечную нотацию</dt>
        <dd>
            <pre class="brush: js">
                foo.name;           // kitten
                foo.color = "red";  // add new property
            </pre>
        </dd>
    </dl>
</div>

<div class="slide">
    <h1>Объекты: добавляем свойства</h1>

    <p>Получить доступ к свойствам объекта можно двумя способами:</p>
    <pre class="brush: js">
        var foo = {name: 'Kitten', age: 27}
    </pre>
    <dl>
        <dt>Квадратными скобками</dt>
        <dd>
            <pre class="brush: js">
                foo['name'];        // kitten

                var get = 'color';
                foo[get];           // red
            </pre>
        </dd>
    </dl>
</div>

<div class="slide">
    <h1>Объекты: добавляем свойства</h1>

    <pre class="brush: js">
        var foo = {name: 'Kitten', age: 27}

        // Используя точечную нотацию
        foo.name;           // kitten
        foo.color = "red";  // add new property

        // Квадратными скобками
        foo['name'];        // kitten

        var get = 'color';
        foo[get];           // red
    </pre>
</div>

<div class="slide">
    <h1>Объекты: удаляем свойства</h1>

    <ul class="incremental">
        <li>Единственный способ удалить свойство у объекта — использовать оператор <code class="js keyword">delete</code>.</li>
        <li>Устанавливая свойство в undefined или null, вы только заменяете связанное с ним значение, но не удаляете ключ.</li>
        <li>
            <pre class="brush: js">
                var obj = { bar: 1, foo: 2, baz: 3 };

                obj.bar = undefined;
                obj.foo = null;
                delete obj.baz;
            </pre>
        </li>
    </ul>
</div>

<div class="slide">
    <h1>Объекты: методы</h1>

    <p>Методы в JS объектах это тоже, что и свойства.</p>
    <pre class="brush: js">
        var object = {
            property : "hello",
            method_01 : function () {...}
        };
        object.method_02 = function() { ... };
    </pre>
    <p>Доступ к другим полям обьекта через <code class="js keyword">this</code></p>
    <pre class="brush: js">
        object.method_03 = function() {
            alert(this.property)
        };
    </pre>
</div>

<div class="slide">
    <h1>Объекты: API</h1>

    <dl>
        <dt>Properties</dt>
        <dd>constructor</dd>
        <dt>Methods</dt>
        <dd>hasOwnProperty, toString, valueOf</dd>
    </dl>
</div>

<div class="slide">
    <h1>Массивы</h1>

    <p>Создание: литералы определённо предпочтительнее.</p>
    <pre class="brush: js">
        [3]; // Результат: [3]
        new Array(3); // Результат: []
        new Array('3') // Результат: ['3']

        var msgArray = new Array();
        msgArray[0] = "Hello";
        msgArray[99] = "world";

        if (msgArray.length == 100) {
           print("The length is 100.");
        }
    </pre>
</div>

<div class="slide">
    <h1>Массивы: API</h1>

    <ul class="incremental">
        <li>pop, push</li>
        <li>reverse, shift, unshift</li>
        <li>sort</li>
        <li>splice, concat, split</li>
        <li>join</li>
    </ul>
    
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Syntax</li>
        <li class="done">Objects</li>
        <li class="current">Functions</li>
        <li>RegExp</li>
        <li>This</li>
    </ul>
</div>

<div class="slide">
    <h1>Функции</h1>

    <pre class="brush: js">
        function addSquares(a,b) {
           function square(x) {
              return x * x;
           }
           return square(a) + square(b);
        }
        
        console.log(addSquares(2,3)); // returns 13
        console.log(addSquares(3,4)); // returns 25
        console.log(addSquares(4,5)); // returns 41
    </pre>
</div>

<div class="slide">
    <h1>Функции: Создание</h1>

    <dl class="incremental">
        <dt>Declaration</dt>
        <dd>
            <pre class="brush: js">
                function name(params) { ... }
            </pre>
        </dd>

        <dt>Expression</dt>
        <dd>
            <pre class="brush: js">
                var name = function(params) { ... }
            </pre>
        </dd>

        <dt>Constructor</dt>
        <dd>
            <pre class="brush: js">
                var name = new Function(params, '...')
            </pre>
        </dd>
    </dl>
</div>

<div class="slide">
    <h1>Функции: Пример</h1>

    <pre class="brush: js">
        function makeAddFunction(amount) {
          function add(number) {
            return number + amount;
          }
          return add;
        }

        var addTwo = makeAddFunction(2);
        var addFive = makeAddFunction(5);
        show(addTwo(1) + addFive(1));
    </pre>
</div>

<div class="slide">
    <h1>Функции: Аргументы</h1>

    <ul class="incremental">
        <li>В сигнатуру функции входит только её имя, а значит, никакой перегрузки быть не может.</li>
        <li>Функция всегда возвращает значение, если оно не указано явно это будет undefined.</li>
        <li>Нет значений по умолчанию, но их можно эмулировать.
            <pre class="brush: js">
                function func(element, list, options) {
                    list = list || [];
                    options = options || {}
                }
            </pre>
        </li>
    </ul>
</div>

<div class="slide">
    <h1>Функции: Аргументы</h1>

    <p>Функции можно запускать с любым числом параметров.</p>
    <pre class="brush: js">
        function func(a,b,c) {
            console.log(a + ", " + b + ", " + c);
            console.log(arguments);
        }

        func(1, 2)       // 1, 2, undefined; {0:1, 1:2}
        func(1, 2, 3, 4) // 1, 2, 3;         {0:1, 1:2, 2:3, 3:4}
    </pre>
</div>

<div class="slide">
    <h1>Функции: API</h1>

    <dl>
        <dt>Properties</dt>
        <dd>caller, constructor, length, name</dd>
        <dt>Methods</dt>
        <dd>apply, call, toSource, toString</dd>
    </dl>
</div>

<div class="slide">
    <h1>Функции: Пример</h1>

    <pre class="brush: js">
        var foo = function fib(n) {
            return n < 2 && 1 || fib(n-1) + fib(n-2);
        }

        foo(6); // 13
        fib();  // получим ReferenceError
    </pre>
</div>

<div class="slide">
    <h1>Вопросы?</h1>

    <a href="">

    </a>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Syntax</li>
        <li class="done">Objects</li>
        <li class="done">Functions</li>
        <li class="current">RegExp</li>
        <li>This</li>
    </ul>
</div>

<div class="slide">
    <h1>RegExp</h1>

    <ul class="incremental">
        <li>Жадность</li>
        <li>Backreferences</li>
        <li>Replace</li>
        <li>Статические свойства</li>
    </ul>
</div>

<div class="slide">
    <h1>Backreferences</h1>

    <pre class="brush: js">
        text = ' [b]a [u]b[/u] c [/b] '

        var reg = /\[([bus])\](.*?)\[\/\1\]/
        text = text.replace(reg, '&lt;$1>$2&lt;/$1>')
        alert(text)
    </pre>
</div>

<div class="slide">
    <h1>RegExp</h1>

    <p>Многострочность</p>
    <pre class="brush: js">
        "[u]мой\n текст[/u]".replace(
            /\[u\](.*?)\[\/u\]/gim, '&lt;u>$1$lt;/u>')

        "[u]мой\n текст[/u]".replace(
            /\[u\]([\s\S]*)\[\/u\]/gim, '&lt;u>$1$lt;/u>')
    </pre>
</div>

<div class="slide">
    <h1>Replace\Replace All</h1>

    <pre class="brush: js">
        "2 ++ 1".replace("+", "*")
        "2 ++ 1".replace(/\+/g, "*")
    </pre>
</div>

<div class="slide">
    <h1>Complex Replacement: Java</h1>

    <pre class="brush: java">
        StringBuffer buffer = new StringBuffer();
        m = myPattern.matcher("subject");
        while (m.find()) {
          if (checkIfThisMatchShouldBeReplaced()) {
            m.appendReplacement(buffer, computeReplacement());
          }
        }
        m.appendTail(buffer);
    </pre>
</div>

<div class="slide">
    <h1>Complex Replacement: JS</h1>

    <p>Без шаманских заклинаний.</p>
    <pre class="brush: js">
        str.replace(/.../g, computeReplacement);
    </pre>

    <div class="incremental">
        <p>В общей форме.</p>
        <pre class="brush: js">
            str.replace(/.../g, function() { return ... })
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Статические свойства</h1>

    <pre class="brush: js">
        var reg = /hello\d+/g;

        var str1 = "hello11 hello12 hello13";
        var str2 = "hello21 hello22 hello23";

        console.log(reg.exec(str1)); // hello11
        console.log(reg.exec(str1)); // hello12
        console.log(reg.exec(str2)); // hello23
    </pre>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Syntax</li>
        <li class="done">Objects</li>
        <li class="done">Functions</li>
        <li class="done" >RegExp</li>
        <li class="current">This</li>
    </ul>
</div>

<div class="slide">
    <h1>This</h1>

    <dl>
        <dt>function</dt>
        <dd>
            <pre class="brush: js">
                function sayHelloTo(name) {
                    console.log(this === window);
                    alert("Hello, " + name + "!");
                }

                sayHelloTo("Alex");
            </pre>

            <p>В таком случае this === window</p>
        </dd>
    </dl>
</div>

<div class="slide">
    <h1>This</h1>

    <dl>
        <dt>method</dt>
        <dd>
            <pre class="brush: js">
                object.method = function () {
                    console.log(this == object);
                }

                object.method();
            </pre>
            <p>В таком случае this === object</p>
        </dd>
    </dl>

</div>

<div class="slide">
    <h1>This</h1>

    <dl>
        <dt>constructor</dt>
        <dd>
            <pre class="brush: js">
                var constrThis;
                function MyConstructor(name) {
                    this.name = name;

                    constrThis = this;
                }

                var obj = new MyConstructor("Name");
                console.log(obj === constrThis);
            </pre>
            <p>В таком случае this === object</p>
        </dd>
    </dl>
</div>

<div class="slide">
    <h1>This</h1>

    <dl>
        <dt>function</dt>
        <dd>this === window</dd>
        <dt>method</dt>
        <dd>this === object</dd>
        <dt>constructor</dt>
        <dd>this === new object</dd>
    </dl>
</div>


<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Syntax</li>
        <li class="done">Objects</li>
        <li class="done">Functions</li>
        <li class="done">RegExp</li>
        <li class="done">This</li>
    </ul>
</div>

<div class="slide">
    <h1>Links</h1>

    <ul>
        <li><a href="https://developer.mozilla.org/en/JavaScript/Reference">JavaScript Reference</a></li>
        <li><a href="http://bonsaiden.github.com/JavaScript-Garden/">JavaScript-Garden</a></li>
        <li><a href="http://wtfjs.com/">WTF</a></li>
        <li><a href="http://www.regular-expressions.info" rel="nofollow">http://www.regular-expressions.info/</a></li>
        <li><a href="http://javascript.ru/tutorial/regexp-specials" rel="nofollow">Особенности регулярных выражений в Javascript</a></li>
        <li><a href="http://jsfiddle.net" rel="nofollow" target="_blank">JsFiddle is a playground for web developers</a></li>
    </ul>
</div>
<div class="slide">
    <h1>Вопросы / Предложения</h1>

    <ul>
        <li>Alex.Kolonitsky@gmail.com</li>
        <li>akolonitsky@exadel.com</li>
        <li>Skype: Desargues_</li>
        <li>http://code.google.com/p/javascript-learning-courses/issues/list</li>
    </ul>
</div>

</body>


</html>
